import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.header import Header
import datetime
import base64
import os

def generate_training_report_html(results_dict, experiment_name, img_base64=''):
    """
    生成训练报告的HTML内容，适配手机端显示
    
    Args:
        results_dict (dict): 包含训练结果的字典，必须包含以下键：
            - mAP50-95
            - mAP50
            - precision
            - recall
            - time-consumption
        experiment_name (str): 实验名称
        img_base64 (str): 可选，base64编码的图片数据
        
    Returns:
        str: 生成的HTML内容
    """
    print(f"生成训练报告HTML: 实验名称='{experiment_name}'")
    print(f"图片状态: {'有图片数据' if img_base64 else '无图片数据'}")
    # 创建适配手机端的HTML模板
    html_content = f'''
    <!DOCTYPE html>
    <html lang="zh-CN">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>训练完成报告</title>
        <style>
            /* 移动端优先的响应式设计 */
            body {{
                font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
                line-height: 1.6;
                margin: 0;
                padding: 16px;
                color: #333;
                background-color: #f5f5f5;
            }}
            .container {{
                max-width: 600px;
                margin: 0 auto;
                background-color: #fff;
                border-radius: 8px;
                padding: 20px;
                box-shadow: 0 2px 8px rgba(0,0,0,0.1);
            }}
            h1 {{
                color: #2c3e50;
                font-size: 20px;
                margin-top: 0;
                border-bottom: 2px solid #3498db;
                padding-bottom: 10px;
            }}
            .result-card {{
                background-color: #f8f9fa;
                border-radius: 6px;
                padding: 15px;
                margin-bottom: 20px;
            }}
            .result-item {{
                display: flex;
                justify-content: space-between;
                margin-bottom: 8px;
                font-size: 16px;
            }}
            .result-label {{
                font-weight: 600;
                color: #555;
            }}
            .result-value {{
                color: #2c3e50;
                font-weight: 700;
            }}
            .chart-container {{
                margin: 20px 0;
                text-align: center;
            }}
            .chart-img {{
                max-width: 100%;
                height: auto;
                border-radius: 6px;
                box-shadow: 0 2px 4px rgba(0,0,0,0.1);
                /* 确保图片在小屏幕上有合适的最大高度 */
                max-height: 500px;
            }}
            .timestamp {{
                text-align: right;
                color: #7f8c8d;
                font-size: 14px;
                margin-top: 20px;
            }}
            /* 为小屏幕设备优化 */
            @media (max-width: 480px) {{
                body {{
                    padding: 8px;
                }}
                .container {{
                    padding: 15px;
                }}
                .result-item {{
                    font-size: 14px;
                }}
                h1 {{
                    font-size: 18px;
                }}
                .chart-img {{
                    max-height: 300px;
                }}
            }}
        </style>
    </head>
    <body>
        <div class="container">
            <h1>模型训练完成报告</h1>
            
            <div class="result-card">
                <div class="result-item">
                    <span class="result-label">mAP50-95:</span>
                    <span class="result-value">{results_dict["mAP50-95"]}</span>
                </div>
                <div class="result-item">
                    <span class="result-label">mAP50:</span>
                    <span class="result-value">{results_dict["mAP50"]}</span>
                </div>
                <div class="result-item">
                    <span class="result-label">precision:</span>
                    <span class="result-value">{results_dict["precision"]}</span>
                </div>
                <div class="result-item">
                    <span class="result-label">recall:</span>
                    <span class="result-value">{results_dict["recall"]}</span>
                </div>
                <div class="result-item">
                    <span class="result-label">time-consumption:</span>
                    <span class="result-value">{results_dict["time-consumption"]}min</span>
                </div>
            </div>
            
            <div class="chart-container">
            {f'<img class="chart-img" src="cid:results_chart" alt="训练结果图表">' if img_base64 else '<p style="color: #e74c3c;">无法加载结果图表</p>'}
            </div>
            
            <div class="timestamp">
                实验名称: {experiment_name}<br>
                生成时间: {datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")}
            </div>
        </div>
    </body>
    </html>
    '''
    return html_content

from email.mime.image import MIMEImage

def send_qq_email(subject, message, to_addr, is_html=False, image_data=None, image_filename="results.png"):
    """
    使用QQ邮箱发送邮件

    Args:
        subject (str): 邮件主题
        message (str): 邮件正文内容
        to_addr (str): 收件人邮箱地址
        is_html (bool): 是否为HTML格式，默认为False（纯文本）
        image_data (bytes): 可选，图片的二进制数据
        image_filename (str): 可选，图片附件的文件名
    """
    # ===== 配置区，请修改为你的信息 =====
    mail_host = "smtp.qq.com"  # SMTP服务器
    mail_port = 465  # 端口
    mail_user = "2264261565@qq.com"  # 你的QQ邮箱
    mail_license = "teauwkzubnbodjbi"  # 你的SMTP授权码，不是QQ密码！
    # =================================

    # 创建邮件对象
    msg = MIMEMultipart('related')  # 使用related类型支持附件引用
    
    # 添加邮件正文
    if is_html:
        msg.attach(MIMEText(message, 'html', 'utf-8'))
    else:
        msg.attach(MIMEText(message, 'plain', 'utf-8'))

    # 设置邮件头部信息
    msg['Subject'] = Header(subject, 'utf-8')  # 主题
    msg['From'] = mail_user  # 发件人
    msg['To'] = to_addr  # 收件人

    # 如果提供了图片数据，添加为内联附件并设置content-id以便在HTML中引用
    if image_data:
        print(f"添加图片附件: {image_filename}, 数据长度: {len(image_data)} 字节")
        image_attachment = MIMEImage(image_data)
        image_attachment.add_header('Content-ID', '<results_chart>')  # 设置content-id，与HTML中的cid:对应
        # 关键修复：使用inline而非attachment，确保图片在邮件中内联显示
        image_attachment.add_header('Content-Disposition', 'inline', filename=image_filename)
        msg.attach(image_attachment)
        print("图片附件添加成功，设置为内联显示")
    else:
        print("警告: 没有提供图片数据，邮件中将不包含图表")

    try:
        # 连接SMTP服务器，使用SSL加密
        smtp = smtplib.SMTP_SSL(mail_host, mail_port)
        # 登录邮箱
        smtp.login(mail_user, mail_license)
        # 发送邮件
        smtp.sendmail(mail_user, [to_addr], msg.as_string())
        # 退出SMTP连接
        smtp.quit()
        print("邮件发送成功！")
        return True
    except smtplib.SMTPException as e:
        print(f"邮件发送失败: {e}")
        return False

# 使用示例
if __name__ == '__main__':
    # 发送纯文本测试邮件
    import datetime
    msg=f"""
    mAP50: 0.9776
    mAP50-95: 0.8007
    precision: 0.9398
    recall: 0.9722
    time-consumption: 50
    """
    time_stamp=datetime.datetime.now().strftime("%Y%m%d_%H%M%S")
    send_qq_email(subject=f'训练在{time_stamp}完成!', message=msg,
    to_addr='2264261565@qq.com',is_html=False)
    # E:/Py/visual/runs/detect/v2_default_20251125_132515/results.png

# 测试图片发送的函数
def test_image_email():
    """
    测试发送包含指定图片的邮件
    使用已知存在的图片路径进行测试
    """
    print("开始测试图片邮件发送...")
    
    # 指定要发送的图片路径
    image_path = "E:/Py/visual/runs/detect/v2_default_20251125_132515/results.png"
    image_data = None
    
    # 读取图片数据
    try:
        with open(image_path, 'rb') as img_file:
            image_data = img_file.read()
        print(f"成功读取图片: {image_path}, 大小: {len(image_data)} 字节")
    except Exception as e:
        print(f"读取图片失败: {e}")
        return False
    
    # 创建HTML邮件内容，包含图片引用
    html_content = """
    <!DOCTYPE html>
    <html>
    <head>
        <meta charset="UTF-8">
        <title>图片测试邮件</title>
    </head>
    <body>
        <h2>图片测试邮件</h2>
        <p>这是一封测试邮件，包含以下图片：</p>
        <img src="cid:results_chart" alt="测试图片" style="max-width: 100%; height: auto;">
        <p>图片应该显示在上方</p>
    </body>
    </html>
    """
    
    # 发送邮件
    time_stamp = datetime.datetime.now().strftime("%Y%m%d_%H%M%S")
    success = send_qq_email(
        subject=f'图片测试邮件 - {time_stamp}',
        message=html_content,
        to_addr='2264261565@qq.com',
        is_html=True,
        image_data=image_data,
        image_filename="test_results.png"
    )
    
    if success:
        print("图片测试邮件发送成功！")
    else:
        print("图片测试邮件发送失败！")
    
    return success

# 如果直接运行此文件，则执行测试
if __name__ == '__main__':
    # 发送纯文本测试邮件
    import datetime
    msg=f"""
    mAP50: 0.9776
    mAP50-95: 0.8007
    precision: 0.9398
    recall: 0.9722
    time-consumption: 50
    """
    time_stamp=datetime.datetime.now().strftime("%Y%m%d_%H%M%S")
    
    # 1. 发送纯文本邮件
    print("\n发送纯文本测试邮件...")
    send_qq_email(subject=f'训练在{time_stamp}完成!', message=msg,
    to_addr='2264261565@qq.com',is_html=False)
    
    # 2. 发送带图片的HTML邮件测试
    print("\n发送图片测试邮件...")
    test_image_email()
    